home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / c / awin / cpu5azure2.asm < prev    next >
Assembly Source File  |  1999-05-17  |  10KB  |  508 lines

  1. ; FILE: GG:src/own/awin/cpu5azure2.ASM          REV: 10 --- fast 040/060 c2p by Azure
  2. ; LINK: >LEAVEOBJ>
  3. ; History
  4. ;  0      This is supposed to be cleaner :)
  5. ;  7      Made it dynamic.
  6. ;  10     Made it mostly(!) dynamic about plane count,
  7. ;         you still *MUST* pass all 8 planes!!
  8. ;
  9.  
  10. ;---------------------------------------------------------------------------
  11. ;5 Pass CPU Chunky to Planar Converter for 68040/60
  12. ;
  13. ; This c2p is enhanced for slow 060-boards like the Blizzard 1260 and
  14. ; Apollo 1260.
  15. ;
  16. ; Tested: Copyspeed on Apollo 1240/40, Apollo 4040/40 , Apollo 1260/50
  17. ;    its probably copyspeed on all 4060 boards, all 1240/40 boards and
  18. ;    all 4040/40 boards. On slower 040 boards it should perform well,
  19. ;    too. I hope it is copyspeed on Blizzard 1260/50,too.
  20. ;
  21. ;(W) and (C) 6-7.5.1997 by Tim Boescke
  22. ;            Azure/Artwork
  23. ;
  24. ;
  25. ;This converter is using enhanced and paired mergeops (rot-merges) taking
  26. ;3 cycles per merge on 060, 8 cycles per merge on 040. Plus a little overhead
  27. ;for final rot-correction. The disadvantage is, that the 16bit merge is slighty
  28. ;slower now on 040.
  29. ;
  30. ;Effective cycles taken for 8lw c2p:
  31. ;
  32. ;            040        060
  33. ;
  34. ;rot paired    merge        169        61.5
  35. ;normal paired    merge        168        68
  36. ;non paired    merge        168        ~132-152
  37. ;
  38.  
  39.  
  40.     XDEF    _awinitchunky2planar
  41.     XDEF    _awchunky2planar
  42.  
  43. ;void awinitchunky2planar(UBYTE *chunky __asm("a0"),
  44. ;                        ULONG width __asm("d0"),
  45. ;                        ULONG height __asm("d1"),
  46. ;                        ULONG depth __asm("d2"));
  47.  
  48. ;void awchunky2planar(UBYTE *planar __asm("a1"));
  49.  
  50.  
  51.  
  52.  
  53. USEA7    equ    0    ;1 = use a7 ,0 = dont use a7 
  54.             ;NoA7 uses selfmodifying code with cacheflush
  55.             ;its applied every time you change the chunkybuffers
  56.             ;location. (a0=source) So changing it a lot of times
  57.             ;could slow the c2p down a bit.
  58.  
  59.  
  60. ;---------------------------------------------------------------------------
  61. ;
  62. ;IN:
  63. ;
  64. ;    a0   =source
  65. ;    d0   =width
  66. ;    d1   =height
  67. ;               d2   =depth
  68. ;
  69. ;----------------------------------------------------------------------------
  70.  
  71.  
  72.     CNOP    0,8
  73. _awinitchunky2planar:
  74.     movem.l    d0-d7/a0-a6,-(a7)
  75.  
  76.     movem.l    d0-d2/a0-a1,-(a7)
  77.     move.l    .alignbase(pc),d0
  78.     bne.b    .norealign
  79.  
  80.     ; Align the c2p to a 16 byte-border
  81.  
  82.     move.l    #_alignhere,d0
  83.     and.w    #$fff0,d0
  84.     move.l    d0,a0
  85.     move.l    a0,.alignbase
  86.  
  87.     lea    _alignhere(pc),a1
  88.     move.w    #_loopend-_alignhere,d0
  89.     lsr.w    #1,d0        ;phxass is drain bamaged
  90. .reloop    move.w    (a1)+,(a0)+
  91.     subq.w    #1,d0
  92.     bne.b    .reloop
  93.  
  94.     ; Get original chip writes
  95.  
  96.     lea    .cwtab(pc),a0
  97.     move.l    .alignbase(pc),a1
  98.     move.w    (_smc_p0-_alignhere,a1),(a0)+
  99.     move.w    (_smc_p1-_alignhere,a1),(a0)+
  100.     move.w    (_smc_p2-_alignhere,a1),(a0)+
  101.     move.w    (_smc_p3-_alignhere,a1),(a0)+
  102.     move.w    (_smc_p4-_alignhere,a1),(a0)+
  103.     move.w    (_smc_p5-_alignhere,a1),(a0)+
  104.     move.w    (_smc_p6-_alignhere,a1),(a0)+
  105.     move.w    (_smc_p7-_alignhere,a1),(a0)+
  106.  
  107. .norealign    movem.l    (a7)+,d0-d2/a0-a1
  108.  
  109.     mulu.w    d1,d0        ;d0=screensize
  110.     move.l    d0,d1
  111.     lsr.l    #3,d1        ;d1=plane (screensize/8)
  112.  
  113.     move.l    a0,_smcsrca0+2
  114.  
  115.     lea    (a0,d0.l),a0
  116.  
  117.     IFNE    USEA7
  118.     move.l    a0,_smcherea7+2
  119.     ENDC
  120.  
  121.     ; must use .alignbase for aligned area!!
  122.     ; (ie. for things between _loop and _loopend)
  123.     move.l    .alignbase(pc),a5
  124.  
  125.     IFEQ    USEA7
  126.     move.l    a0,(_endsmc+2-_alignhere,a5)
  127.     ENDC
  128.  
  129.     ;d1=plane (screensize/8)
  130.     move.l    d1,(_smc_plane01+2-_alignhere,a5)
  131.     move.l    d1,(_smc_plane02+2-_alignhere,a5)
  132.     move.l    d1,(_smc_plane03+2-_alignhere,a5)
  133.     move.l    d1,_smc_plane04+2
  134.     move.l    d1,_smc_plane05+2
  135.     move.l    d1,_smc_plane06+2
  136.  
  137.     move.l    d1,d3
  138.     add.l    d1,d3        ;d3=2*plane
  139.  
  140.     move.l    d3,(_smc_2plane01+2-_alignhere,a5)
  141.     move.l    d3,_smc_2plane02+2
  142.  
  143.     move.l    d3,d4
  144.     addq.l    #4,d4        ;d4=2*plane+4
  145.     move.l    d4,(_smc_2plane401+2-_alignhere,a5)
  146.  
  147.     move.l    d3,d4
  148.     add.l    d4,d4        ;d4=4*plane
  149.     move.l    d4,(_smc_4plane01+2-_alignhere,a5)
  150.     add.l    d1,d4
  151.     subq.l    #4,d4        ;d4=5*plane-4
  152.     move.l    d4,_smc_5plane401+2
  153.  
  154.     move.l    d1,d3
  155.     add.l    d1,d3
  156.     add.l    d1,d3        ;d3=3*plane
  157.     move.l    d3,(_smc_3plane01+2-_alignhere,a5)
  158.  
  159.     move.l    d3,d4
  160.     add.l    d4,d4        ;d4=6*plane
  161.     move.l    d4,(_smc_6plane01+2-_alignhere,a5)
  162.  
  163.     lea    .cwtab(pc),a0
  164.     move.w    (a0)+,(_smc_p0-_alignhere,a5)
  165.     move.w    (a0)+,(_smc_p1-_alignhere,a5)
  166.     move.w    (a0)+,(_smc_p2-_alignhere,a5)
  167.     move.w    (a0)+,(_smc_p3-_alignhere,a5)
  168.     move.w    (a0)+,(_smc_p4-_alignhere,a5)
  169.     move.w    (a0)+,(_smc_p5-_alignhere,a5)
  170.     move.w    (a0)+,(_smc_p6-_alignhere,a5)
  171.     move.w    (a0)+,(_smc_p7-_alignhere,a5)
  172.  
  173.     cmp.l    #8,d2
  174.     bls.b    .dok
  175.     moveq    #8,d2
  176. .dok    move.w    #$2048,d0    ;move.l a0,a0
  177.     jmp    .djpos(pc,d2.l*4)
  178. .djpos    move.w    d0,(_smc_p0-_alignhere,a5)
  179.     move.w    d0,(_smc_p1-_alignhere,a5)
  180.     move.w    d0,(_smc_p2-_alignhere,a5)
  181.     move.w    d0,(_smc_p3-_alignhere,a5)
  182.     move.w    d0,(_smc_p4-_alignhere,a5)
  183.     move.w    d0,(_smc_p5-_alignhere,a5)
  184.     move.w    d0,(_smc_p6-_alignhere,a5)
  185.     move.w    d0,(_smc_p7-_alignhere,a5)
  186.  
  187.     move.l    4.w,a6
  188.     jsr    -636(a6)    ;cacheflush
  189.  
  190.     movem.l    (a7)+,d0-d7/a0-a6
  191.     rts
  192. .alignbase    dc.l    0
  193. .cwtab    dc.w    0,0,0,0
  194.     dc.w    0,0,0,0
  195.  
  196. ;
  197. ;IN:
  198. ;
  199. ;    (a0   =source)
  200. ;    a1   =target
  201. ;
  202. ;NOTE!!!! : Dont use any optimizations when assembling this! Especially
  203. ;    not with PHXass. The generated code might not work otherwise.
  204. ;---------------------------------------------------------------------------
  205.  
  206.     CNOP    0,8
  207. _awchunky2planar:
  208.     movem.l    d0-d7/a2-a6,-(a7)
  209.  
  210. _smcsrca0    move.l    #$1337C0DE,a0
  211.  
  212.     IFNE    USEA7
  213.     move.l    a7,_a7save
  214. _smcherea7    move.l    #$BADC0DE,a7        ;a7=endpointer
  215.     ENDC
  216.  
  217. _smc_5plane401    add.l    #$C0DE7,a1        ;5*.plane-4,a1
  218.  
  219.     move.l    (a0)+,d0
  220.     move.l    (a0)+,d1
  221.     move.l    (a0)+,d2
  222.     move.l    (a0)+,d3
  223.     move.l    (a0)+,d4
  224.     move.l    (a0)+,a3
  225.     move.l    (a0)+,d6
  226.     move.l    (a0)+,a2
  227.     swap    d4
  228.     swap    d6
  229.     eor.w    d0,d4
  230.     eor.w    d2,d6
  231.     eor.w    d4,d0
  232.     eor.w    d6,d2
  233.     eor.w    d0,d4
  234.     eor.w    d2,d6
  235.     ror.l    #8,d2
  236.     rol.l    #8,d4
  237.     move.l    d6,d7
  238.     move.l    d2,d5
  239.     eor.l    d4,d7
  240.     eor.l    d0,d5
  241.     and.l    #$00FF00FF,d5
  242.     and.l    #$FF00FF00,d7
  243.     eor.l    d5,d0
  244.     eor.l    d7,d4
  245.     eor.l    d5,d2
  246.     eor.l    d7,d6
  247.     rol.l    #6,d4
  248.     rol.l    #6,d6
  249.     move.l    d4,d5
  250.     move.l    d6,d7
  251.     eor.l    d0,d5
  252.     eor.l    d2,d7
  253.     and.l    #$33333333,d5
  254.     and.l    #$33333333,d7
  255.     eor.l    d5,d0
  256.     eor.l    d7,d2
  257.     eor.l    d5,d4
  258.     eor.l    d7,d6
  259.     rol.l    #4,d2
  260.     rol.l    #4,d6
  261.     move.l    a2,d7
  262.     move.l    a3,d5
  263.     move.l    d6,a2
  264.     move.l    d4,a3
  265.     swap    d5
  266.     swap    d7
  267.     eor.w    d1,d5
  268.     eor.w    d3,d7
  269.     eor.w    d5,d1
  270.     eor.w    d7,d3
  271.     eor.w    d1,d5
  272.     eor.w    d3,d7
  273.     ror.l    #8,d3
  274.     rol.l    #8,d5
  275.     move.l    d7,d6
  276.     move.l    d3,d4
  277.     eor.l    d5,d6
  278.     eor.l    d1,d4
  279.     and.l    #$00FF00FF,d4
  280.     and.l    #$FF00FF00,d6
  281.     eor.l    d4,d1
  282.     eor.l    d6,d5
  283.     eor.l    d4,d3
  284.     eor.l    d6,d7
  285.     rol.l    #6,d5
  286.     rol.l    #6,d7
  287.     move.l    d5,d4
  288.     move.l    d7,d6
  289.     eor.l    d1,d4
  290.     eor.l    d3,d6
  291.     and.l    #$33333333,d4
  292.     and.l    #$33333333,d6
  293.     eor.l    d4,d1
  294.     eor.l    d6,d3
  295.     eor.l    d4,d5
  296.     eor.l    d6,d7
  297.     ror.l    #4,d1
  298.     ror.l    #4,d5
  299.  
  300.     move.l    a2,d6
  301.     move.l    d5,a2
  302.  
  303.     REPT    4    ;space for realigning
  304.     move.l    a1,a1    ;pipelined/superscalar nop
  305.     move.l    a2,a2    ;(Note: the real NOP is more than a
  306.             ; No-Operation. It does Pipeline-Sync and
  307.             ; is dead slow that way)
  308.             ;asm-one isnt assembling trapf
  309.     ENDR
  310. _alignhere
  311.     bra.w    _enter_here
  312.  
  313.     REPT    3
  314.     move.l    a1,a1
  315.     move.l    a2,a2
  316.     ENDR
  317. _loop
  318.     move.l    (a0)+,d0
  319.     move.l    (a0)+,d1
  320.     move.l    (a0)+,d2
  321.     move.l    (a0)+,d3
  322.     move.l    (a0)+,d4
  323.     move.l    (a0)+,a3
  324.     move.l    (a0)+,d6
  325.     move.l    (a0)+,a2
  326. _smc_p0    move.l    d7,(a1)            ;plane0
  327.     swap    d4
  328.     swap    d6
  329.     eor.w    d0,d4
  330.     eor.w    d2,d6
  331.     eor.w    d4,d0
  332.     eor.w    d6,d2
  333.     eor.w    d0,d4
  334.     eor.w    d2,d6
  335. _smc_plane01    add.l    #$C0DE1,a1
  336.     ror.l    #8,d2
  337.     rol.l    #8,d4
  338. _smc_p1    move.l    d5,(a1)            ;plane1
  339.     move.l    d6,d7
  340.     move.l    d2,d5
  341.     eor.l    d4,d7
  342.     eor.l    d0,d5
  343.     and.l    #$00FF00FF,d5
  344.     and.l    #$FF00FF00,d7
  345.     eor.l    d5,d0
  346.     eor.l    d7,d4
  347.     eor.l    d5,d2
  348.     eor.l    d7,d6
  349.     rol.l    #6,d4
  350.     rol.l    #6,d6
  351. _smc_plane02    add.l    #$C0DE1,a1
  352.     move.l    d4,d5
  353.     move.l    d6,d7
  354.     eor.l    d0,d5
  355.     eor.l    d2,d7
  356.     and.l    #$33333333,d5
  357.     and.l    #$33333333,d7
  358.     eor.l    d5,d0
  359.     eor.l    d7,d2
  360.     eor.l    d5,d4
  361. _smc_p2    move.l    a4,(a1)            ;plane2
  362.     eor.l    d7,d6
  363.     rol.l    #4,d2
  364.     rol.l    #4,d6
  365.     move.l    a2,d7
  366.     move.l    a3,d5
  367.     move.l    d6,a2
  368.     move.l    d4,a3
  369.     swap    d5
  370.     swap    d7
  371.     eor.w    d1,d5
  372.     eor.w    d3,d7
  373.     eor.w    d5,d1
  374.     eor.w    d7,d3
  375.     eor.w    d1,d5
  376.     eor.w    d3,d7
  377. _smc_2plane01    add.l    #$C0DE2,a1
  378.     ror.l    #8,d3
  379.     rol.l    #8,d5
  380.     move.l    d7,d6
  381.     move.l    d3,d4
  382.     eor.l    d5,d6
  383. _smc_p4    move.l    a5,(a1)            ;plane4
  384.     eor.l    d1,d4
  385.     and.l    #$00FF00FF,d4
  386.     and.l    #$FF00FF00,d6
  387.     eor.l    d4,d1
  388.     eor.l    d6,d5
  389.     eor.l    d4,d3
  390.     eor.l    d6,d7
  391.     rol.l    #6,d5
  392.     rol.l    #6,d7
  393.     move.l    d5,d4
  394.     move.l    d7,d6
  395.     eor.l    d1,d4
  396.     eor.l    d3,d6
  397. _smc_plane03    add.l    #$C0DE1,a1
  398.     and.l    #$33333333,d4
  399.     and.l    #$33333333,d6
  400.     eor.l    d4,d1
  401.     eor.l    d6,d3
  402.     eor.l    d4,d5
  403.     eor.l    d6,d7
  404.  
  405.     ror.l    #4,d1
  406.     ror.l    #4,d5
  407.  
  408.     move.l    a2,d6
  409.     move.l    d5,a2
  410. _smc_p5    move.l    a6,(a1)            ;plane5
  411. _ent